package com.ynkbny.util;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

/**
 * 返回实体
 * @author Gaoju
 */
@Data
@Api("返回实体")
public class Res<T> {

    private static RespStaticEnum SUCCESS = RespStaticEnum.SUCCESS;
    private static RespStaticEnum FAIL = RespStaticEnum.FAIL;

    /**
     * 响应状态码
     */
    @ApiModelProperty("响应状态码")
    private Integer status;

    /**
     * 响应提示信息
     */
    @ApiModelProperty("响应提示信息")
    private String message;

    /**
     * 响应的数据
     */
    @ApiModelProperty("响应的数据")
    private T data;

    /**
     * 成功
     *
     * @param <T> 返回数据类型
     * @return 响应信息
     */
    public static <T> Res<T> ok(){
        return Res.ok(null);
    }

    /**
     * 成功
     *
     * @param obj 返回数据
     * @param <T> 返回数据类型
     * @return 响应信息
     */
    public static <T> Res<T> ok(T obj){
        return Res.ok(SUCCESS, obj);
    }

    /**
     * 成功
     * @param respStaticEnum 返回提示信息
     * @param obj 返回数据
     * @param <T> 返回数据类型
     * @return 响应信息
     */
    public static <T> Res<T> ok(RespStaticEnum respStaticEnum, T obj){
        Res<T> result = new Res<>();
        result.setStatus(respStaticEnum.getStatus());
        result.setMessage(respStaticEnum.getMsg());
        result.setData(obj);
        return result;
    }

    /**
     * 失败
     * @return 响应信息
     */
    public static <T> Res<T> fail(){
        return Res.fail(null);
    }

    /**
     * 失败
     * @param obj 返回数据
     * @param <T> 返回数据类型
     * @return 返回信息
     */
    public static <T> Res<T> fail(T obj){
        return Res.fail(FAIL, obj);
    }

    /**
     * 失败
     * @param msg 返回提示信息
     * @param <T> 返回数据类型
     * @return 返回信息
     */
    public static <T> Res<T> fail(String msg){
        Res<T> result = new Res<>();
        result.setStatus(RespStaticEnum.FAIL.getStatus());
        result.setMessage(msg);
        return result;
    }

    /**
     * 失败
     * @param respStaticEnum 返回提示信息枚举
     * @param obj 返回数据
     * @param <T> 返回数据类型
     * @return 返回信息
     */
    public static <T> Res<T> fail(RespStaticEnum respStaticEnum, T obj){
        Res<T> result = new Res<>();
        result.setStatus(respStaticEnum.getStatus());
        result.setMessage(respStaticEnum.getMsg());
        result.setData(obj);
        return result;
    }


}